home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / programming / e / lsestuff / dbmapx.e < prev    next >
Text File  |  1999-11-29  |  4KB  |  213 lines

  1. OPT MODULE
  2.  
  3. MODULE '*/mymods/bits'
  4. MODULE '*xli'
  5.  
  6. EXPORT OBJECT dBMapX_CPObj
  7.    x
  8.    bit:INT
  9. ENDOBJECT
  10.  
  11. OBJECT bitnode OF xni
  12.    bits
  13. ENDOBJECT
  14.  
  15. EXPORT OBJECT dBMapX OF xli
  16. ENDOBJECT
  17.  
  18. PROC private_Methods_From_Here() OF dBMapX IS EMPTY
  19.  
  20. PROC dBMapX() OF dBMapX IS NIL
  21.  
  22. PROC set(x) OF dBMapX
  23.    DEF n:PTR TO bitnode
  24.    DEF nodenum
  25.    DEF nodebitnum
  26.    nodenum := x / 32
  27.    nodebitnum := x - (32 * nodenum)
  28.    n := self.find(nodenum)
  29.    IF n = NIL
  30.       n := FastNew(SIZEOF bitnode)
  31.       self.ordInsert(n)
  32.       n.id := nodenum
  33.    ENDIF
  34.    n.bits := bitSet(n.bits, nodebitnum)
  35. ENDPROC
  36.  
  37. PROC clr(x) OF dBMapX
  38.    DEF n:PTR TO bitnode
  39.    DEF nodenum
  40.    DEF nodebitnum
  41.    nodenum := x / 32
  42.    nodebitnum := x - (32 * nodenum)
  43.    n := self.find(nodenum)
  44.    IF n = NIL
  45.       n := FastNew(SIZEOF bitnode)
  46.       self.ordInsert(n)
  47.       n.id := nodenum
  48.    ENDIF
  49.    n.bits := bitClr(n.bits, nodebitnum)
  50.    IF n.bits = NIL THEN self.removeFastDispose(n, SIZEOF bitnode)
  51. ENDPROC
  52.  
  53. PROC get(x) OF dBMapX
  54.    DEF n:PTR TO bitnode
  55.    DEF nodenum
  56.    DEF nodebitnum
  57.    nodenum := x / 32
  58.    nodebitnum := x - (32 * nodenum)
  59.    n := self.find(nodenum)
  60.    IF n = NIL THEN RETURN NIL
  61. ENDPROC bitGet(n.bits, nodebitnum)
  62.  
  63. PROC count() OF dBMapX
  64.    DEF n:PTR TO bitnode
  65.    DEF a
  66.    DEF count=NIL
  67.    n := self.first()
  68.    WHILE n
  69.       FOR a := 0 TO 31
  70.          IF bitGet(n.bits, a) THEN INC count
  71.       ENDFOR
  72.       n := n.next
  73.    ENDWHILE
  74. ENDPROC count
  75.  
  76. PROC getMaxX() OF dBMapX
  77.    DEF lastnode:PTR TO bitnode
  78.    DEF long
  79.    DEF a=NIL
  80.    lastnode := self.last()
  81.    IF lastnode = NIL THEN RETURN NIL
  82.    long := lastnode.bits
  83.    WHILE long
  84.       long := bitClr(long, a)
  85.       INC a
  86.    ENDWHILE
  87. ENDPROC ((lastnode.id) * 32) + a - 1
  88.  
  89. PROC getMinX() OF dBMapX
  90.    DEF firstnode:PTR TO bitnode
  91.    DEF long
  92.    DEF a=31
  93.    firstnode := self.first()
  94.    IF firstnode = NIL THEN RETURN NIL
  95.    long := firstnode.bits
  96.    WHILE long
  97.       long := bitClr(long, a)
  98.       DEC a
  99.    ENDWHILE
  100. ENDPROC ((firstnode.id) * 32) + a + 1
  101.  
  102. PROC cmp(dbm:PTR TO dBMapX) OF dBMapX
  103.    DEF n:REG PTR TO bitnode
  104.    DEF n2:REG PTR TO bitnode
  105.    n := self.first()
  106.    n2 := dbm.first()
  107.    WHILE n OR n2
  108.       IF n.bits <> n2.bits THEN RETURN FALSE
  109.       n := n.next
  110.       n2 := n2.next
  111.    ENDWHILE
  112. ENDPROC TRUE
  113.  
  114. PROC or(dbm:PTR TO dBMapX) OF dBMapX
  115.    DEF n1:PTR TO bitnode
  116.    DEF n2:PTR TO bitnode
  117.    DEF newnode:PTR TO bitnode
  118.    n1 := self.first()
  119.    n2 := dbm.first()
  120.    WHILE n2
  121.       IF n1.id < n2.id
  122.          n1 := n1.next
  123.       ELSEIF n1.id = n2.id
  124.          n1.bits := n1.bits OR n2.bits
  125.          n1 := n1.next
  126.          n2 := n2.next
  127.       ELSE 
  128.          newnode := FastNew(SIZEOF bitnode)
  129.          newnode.id := n2.id
  130.          newnode.bits := n2.bits
  131.          self.ordInsert(newnode)
  132.          n2 := n2.next
  133.       ENDIF
  134.    ENDWHILE
  135. ENDPROC
  136.  
  137. PROC xor(dbm:PTR TO dBMapX) OF dBMapX
  138.    DEF n1:PTR TO bitnode
  139.    DEF n2:PTR TO bitnode
  140.    DEF newnode:PTR TO bitnode
  141.    n1 := self.first()
  142.    n2 := dbm.first()
  143.    WHILE n2
  144.       IF n1.id < n2.id
  145.          n1 := n1.next
  146.       ELSEIF n1.id = n2.id
  147.          n1.bits := Eor(n1.bits, n2.bits)
  148.          n1 := n1.next
  149.          n2 := n2.next
  150.       ELSE
  151.          newnode := FastNew(SIZEOF bitnode)
  152.          newnode.id := n2.id
  153.          newnode.bits := n2.bits
  154.          self.ordInsert(newnode)
  155.          n2 := n2.next
  156.       ENDIF
  157.    ENDWHILE
  158. ENDPROC
  159.  
  160. PROC and(dbm:PTR TO dBMapX) OF dBMapX
  161.    DEF n1:REG PTR TO bitnode
  162.    DEF n2:REG PTR TO bitnode
  163.    n1 := self.first()
  164.    n2 := dbm.first()
  165.    WHILE n1
  166.       IF n1.id < n2.id
  167.          n1 := n1.next
  168.       ELSEIF n1.id = n2.id
  169.          n1.bits := n1.bits AND n2.bits
  170.          n1 := n1.next
  171.          n2 := n2.next
  172.       ELSE
  173.          n2 := n2.next
  174.       ENDIF
  175.    ENDWHILE
  176. ENDPROC
  177.  
  178. PROC clear() OF dBMapX IS self.removeFastDisposeAll(SIZEOF bitnode)
  179.  
  180. PROC cloneContentsTo(d:PTR TO dBMapX) OF dBMapX
  181.    self.cloneFastNew(d, SIZEOF bitnode)
  182. ENDPROC d
  183.  
  184. PROC indexTraverse(proc, obj:PTR TO dbmapX_travObj, startid, endid)
  185.    DEF a
  186.    FOR a := startid TO stopid
  187.       obj.x := a
  188.       obj.bit := self.get(a)
  189.       proc(obj)
  190.    ENDFOR
  191. ENDPROC
  192.  
  193. PROC forEach1CallProc(proc, obj:PTR TO dBMapX_CPObj)
  194.    DEF node:PTR TO bitnode
  195.    DEF a
  196.    node := self.first()
  197.    WHILE node
  198.       FOR a := 0 TO 31
  199.          IF bitGet(node.bits, a)
  200.             obj.bit := 1
  201.             obj.x := (node.id * 32) + a
  202.             proc(obj)
  203.          ENDIF
  204.       ENDFOR
  205.       node := node.next
  206.    ENDWHILE
  207. ENDPROC
  208.  
  209. PROC end() OF dBMapX IS self.clear()
  210.  
  211.  
  212.  
  213.